package domain;
import java.util.Calendar;
import java.util.Date;
import java.util.Vector;

import persistencia.AdministradorPersistenciaLinea;

public class Linea implements Persistible {

	private int lineaId;
	private Numero numero;
	private Date fechaContrato;
	private Usuario usuario;
	private Date fechaCierre;
	private Vector<Consumo> consumos;
	private Plan plan;
	private String estado;	
	private String nombre;

	public Linea(int lineaId, String estado, Date fechaCierre,
			Date fechaContrato, Numero numero, Plan plan, Usuario usuario, String nombre) {

		this.lineaId = lineaId;
		this.consumos = new Vector<Consumo>();
		this.estado = estado;
		this.fechaCierre = fechaCierre;
		this.fechaContrato = fechaContrato;
		this.numero = numero;
		this.plan = plan;
		this.usuario = usuario;
		this.nombre = nombre;
	}

	public int getId() {
		return lineaId;
	}

	public Numero getNumero() {
		return numero;
	}

	public void setNumero(Numero numero) {
		this.numero = numero;
	}

	public Date getFechaContrato() {
		return fechaContrato;
	}

	public void setFechaContrato(Date fechaContrato) {
		this.fechaContrato = fechaContrato;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Date getFechaCierre() {
		return fechaCierre;
	}

	public void setFechaCierre(Date fechaCierre) {
		this.fechaCierre = fechaCierre;
	}

	public Vector<Consumo> getConsumos(Date inicioPeriodo, Date finalPeridoo) {
		Vector<Consumo> consumosDelPeriodo = new Vector<Consumo>();
		for (Consumo consumo : consumos) {
			if(consumo.getFecha().after(inicioPeriodo) 
					&& consumo.getFecha().before(finalPeridoo)
					&& !consumo.getEstado().equals("Facturado"))
				consumosDelPeriodo.add(consumo);
		}
		return consumosDelPeriodo;
	}
	
	public Factura facturar(Date inicioPeriodo, Date finPeriodo) {
		
		Plan plan = this.getPlan();
		Factura factura = new Factura(0, Calendar.getInstance().getTime(), inicioPeriodo, finPeriodo, 0, usuario);		
		
		for (Consumo consumo : this.getConsumos(inicioPeriodo, finPeriodo)) {
			consumo.setEstado("Facturado");
			factura.addItemFactura(new ItemFactura(consumo, plan.calcularCosto(consumo)));
		}		
		
		return factura;
	}

	public Vector<Consumo> getConsumos() {
		return consumos;
	}	

	public Plan getPlan() {
		return plan;
	}
	
	public void addConsumo(Consumo consumo) {
		consumos.add(consumo);
	}

	public void setPlan(Plan plan) {
		this.plan = plan;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	@Override
	public void persistir() {
		AdministradorPersistenciaLinea.getInstancia().insert(this);
	}

	public static Vector<Linea> getLineas() {
		return AdministradorPersistenciaLinea.getInstancia().obtenerTodos();
	}
	
	public static Vector<Linea> getLineasAFacturar() {
		return AdministradorPersistenciaLinea.getInstancia().obtenerLineasAFacturar();
	}

	public String getNombre() {
		return nombre;
	}

	public void update() {
		AdministradorPersistenciaLinea.getInstancia().update(this);		
	}

}
